package com.elitesland.org.service;

import com.elitesland.core.base.PagingVO;
import com.elitesland.org.param.EmployeeQParam;
import com.elitesland.org.param.EmployeeSave;
import com.elitesland.org.vo.EmployeeVO;

import java.util.List;
import java.util.Optional;

public interface EmployeeService {

    /**
     * 检索雇员数据
     *
     * @param param 雇员信息检索条件对象
     * @return 雇员信息结果集
     */
    PagingVO<EmployeeVO> search(EmployeeQParam param);

    /**
     * 检索关联雇员数据
     * @param param 雇员信息检索条件对象
     * @return 雇员信息结果集
     */
    PagingVO<EmployeeVO> searchRefs(EmployeeQParam param);

    /**
     * 根据记录ID，返回对应的雇员信息
     *
     * @param id 雇员记录ID
     * @return 雇员信息
     */
    Optional<EmployeeVO> oneById(Long id);

    List<EmployeeVO> listByIds(List<Long> ids);

    /**
     * 根据系统用户
     *
     * @param sysUserName
     * @return
     */
    Optional<EmployeeVO> oneBySysUserName(String sysUserName);

    /**
     * 创建雇员信息
     *
     * @param employee 新增的雇员信息
     * @return 新增雇员记录ID
     */
    Long create(EmployeeSave employee);

    /**
     * 更新雇员信息
     *
     * @param employee 需要更新的雇员信息
     */
    void update(EmployeeSave employee);

    /**
     * 根据雇员记录ID删除对应雇员记录和对应系统账号
     *
     * @param id 雇员记录ID
     */
    void removeById(Long id);

    void bindToBu(Long employeeId, Long buId);

    void bindSysUserToEmployee(String sysUsername, Long employeeId);

    void unbindEmployeeWithSysUser(Long employeeId);

    void bindReportTo(Long downId, Long upId);

    void unbindReportTo(Long id);

    Optional<EmployeeVO> findReportTo(Long id);

    List<EmployeeVO> listReportSubs(Long id);

    List<EmployeeVO> listReportSubsAll(Long id);
}
